#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#define SOCKET_PATH "./socket.domain"
int main(int argc, char **argv)
{
 int rv = -1;
 int listen_fd, client_fd = -1;
 struct sockaddr_un serv_addr;//bind需要将服务器信息添加到该结构体中，包括：协议（ipv4或ipv6）与路径名 
 struct sockaddr_un cli_addr;
 socklen_t cliaddr_len;
 char buf[1024];
 
 //listen_fd = socket(AF_UNIX, SOCK_STREAM, 0);
 listen_fd = socket(AF_LOCAL, SOCK_STREAM, 0);
 if(listen_fd < 0 )
 {
 printf("create socket failure: %s\n", strerror(errno));
 return -1;
 }
 printf("socket create fd[%d]\n", listen_fd);
 
 /*if( access(SOCKET_PATH, F_OK) == 0 )//?存在删除作用:无作用
 {
	 printf("SOCKET_PATH 存在，现在删除\n");

	 unlink(SOCKET_PATH);

	 if( access(SOCKET_PATH,F_OK)==-1 )
	 {
	 
		 printf("SOCKET_PATH已经删除\n");
	 }
 }
 */
 
 memset(&serv_addr, 0, sizeof(serv_addr));
 serv_addr.sun_family=AF_UNIX;
/strncpy(serv_addr.sun_path, SOCKET_PATH, sizeof(serv_addr.sun_path)-1);//能不能用“=”赋值？:不行
if( access(SOCKET_PATH, F_OK) == 0 )
 {
         printf("SOCKET_PATH 存在\n");
 }
 if( bind(listen_fd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0 )//创建SOCKET_PATH文件
 {
 printf("create socket failure: %s\n", strerror(errno));
 unlink(SOCKET_PATH);//添加与否无影响
 return -2;
 }

 if( access(SOCKET_PATH, F_OK) == 0 )
 {
         printf("SOCKET_PATH 存在\n");
 }

 printf("socket[%d] bind on path \"%s\" ok\n", listen_fd, SOCKET_PATH);

 listen(listen_fd, 13);
 
 while(1) 
 {
 printf("\nStart waiting and accept new client connect...\n");
 client_fd = accept(listen_fd, (struct sockaddr*)&cli_addr, &cliaddr_len);
 if(client_fd < 0)
 {
 printf("accept new socket failure: %s\n", strerror(errno));
 return -2;
 }
 memset(buf, 0, sizeof(buf)); 
 if( (rv=read(client_fd, buf, sizeof(buf))) < 0)
 {
 printf("Read data from client socket[%d] failure: %s\n", client_fd, strerror(errno));
 close(client_fd);
 continue;
 }
 else if( rv == 0 )
 {
 printf("client socket[%d] disconnected\n", client_fd);
 close(client_fd);
 continue;
 }
 printf("read %d bytes data from client[%d] and echo it back: '%s'\n", rv, client_fd, buf);
 if( write(client_fd, buf, rv) < 0 )
 {
 printf("Write %d bytes data back to client[%d] failure: %s\n", rv, client_fd,
strerror(errno));
 close(client_fd);
 }
 sleep(1);
 close(client_fd);
 }
 close(listen_fd);
}

